/*************************************************************************
> File Name: iterate.cpp
> Author: icebear
> Mail: 3322366195@qq.com
> Created Time: 2023-07-30 16:43:16
> Description:
给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头
************************************************************************/

#include <iostream>
#include <link.h>
struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution
{
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
    {
        ListNode *head = new ListNode(0, nullptr);
        ListNode *tail = head;
        int carry = 0;
        tail->val += carry;       // 插入
        while (l1 || l2 || carry) // 获取要插入的值
        {
            if (l1) // 与l1计算
            {
                carry += l1->val;
                l1 = l1->next;
            }
            if (l2) // 与l2计算
            {
                carry += l2->val;
                l2 = l2->next;
            }
            tail->next = new ListNode(carry % 10);
            tail = tail->next;
            carry /= 10;
        }
        return head->next; // 第一个节点浪费了
    }
};
int main(int argc, char const *argv[])
{
    ListNode *l1 = new ListNode(2);
    l1->next = new ListNode(4);
    l1->next->next = new ListNode(3);

    ListNode *l2 = new ListNode(5);
    l2->next = new ListNode(6);
    l2->next->next = new ListNode(4);
    Solution s;
    ListNode *result = s.addTwoNumbers(l1, l2);
    printf("%d %d %d\n", result->val, result->next->val, result->next->next->val);
    return 0;
}